package poo.expression;

import java.util.StringTokenizer;

public class Espressione {

	private String linea;

	public Espressione(String linea) {
		this.linea = linea;
	}

	public int valutaEspressione() {
		StringTokenizer st = new StringTokenizer(linea, "+-*/()", true);
		return valutaEspressione(st);
	}

	private int valutaEspressione(StringTokenizer st) {
		int ris = valutaOperando(st);
		while (st.hasMoreTokens()) {
			char op = st.nextToken().charAt(0);
			if (op == ')')
				return ris;
			int opnd = valutaOperando(st);
			switch (op) {
			case '+':
				ris += opnd;
				break;
			case '-':
				ris -= opnd;
				break;
			case '*':
				ris *= opnd;
				break;
			case '/':
				ris /= opnd;
				break;
			default:
				throw new RuntimeException("Espressione Malformata");
			}
		}
		return ris;
	}

	private int valutaOperando(StringTokenizer st) {
		String tk = st.nextToken();
		if (tk.equals("("))
			return valutaEspressione(st);
		int opnd = Integer.parseInt(tk);
		return opnd;
	}

	public String toString() {
		return linea;
	}

	public boolean equals(Object x) {
		if (!(x instanceof Espressione))
			return false;
		if (x == this)
			return true;
		Espressione e = (Espressione) x;
		return this.linea.equals(e.linea);
	}

	public int hashCode() {
		return linea.hashCode();
	}

}// Espressione
